home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / util1 / yk211src.lha / Yak_2.11_Src / Prefs / BGUI / Options_Window.c < prev    next >
C/C++ Source or Header  |  1995-11-16  |  27KB  |  721 lines

  1. /************************************************************************
  2. *************************  BGUI OPTIONS WINDOW  *************************
  3. ************************************************************************/
  4.  
  5.  
  6. #include <exec/types.h>
  7. #include <exec/memory.h>
  8. #include <intuition/intuition.h>
  9. #include <intuition/classes.h>
  10. #include <intuition/classusr.h>
  11. #include <intuition/imageclass.h>
  12. #include <intuition/gadgetclass.h>
  13. #include <intuition/intuitionbase.h>
  14. #include <libraries/bgui.h>
  15. #include <libraries/bgui_macros.h>
  16.  
  17. #include <proto/exec.h>
  18. #include <proto/intuition.h>
  19. #include <proto/bgui.h>
  20. #include <proto/graphics.h>
  21. #include <proto/wb.h>
  22. #include <clib/alib_protos.h>
  23. #include <string.h>
  24.  
  25. #include "code.h"
  26. #include "version.h"
  27. #include "hotkey_types.h"
  28. #include "yak.h"
  29. #include "gui.h"
  30. #include "Options_window.h"
  31.  
  32. #include "yak_locale_strings.h"
  33.  
  34. #ifdef _DCC
  35. #  include <lists.h>
  36. #else
  37. #  include "sas_lists.h"
  38. #endif
  39.  
  40. /************************************************************************
  41. *****************************  REFERENCES  ******************************
  42. ************************************************************************/
  43.  
  44. IMPORT LONG (*HandleReturnID)(LONG ID);
  45. IMPORT YakHotKey       *curhk;
  46. IMPORT UWORD            curtype;
  47. IMPORT char            *PrefsHelp;
  48.  
  49. /************************************************************************
  50. *****************************  PROTOTYPES  ******************************
  51. ************************************************************************/
  52.  
  53.  
  54. /************************************************************************
  55. *****************************  LOCAL DATA  ******************************
  56. ************************************************************************/
  57.  
  58. struct Window   *OptionsWnd = NULL;
  59. Object                  *OptionsWndObj = NULL;
  60. Object                  *OptionsObjects[Options_CNT];
  61. UBYTE           *OptionsWdt = NULL;
  62. struct IBox             OptionsBox;
  63. BOOL                    OptionsBoxValid = FALSE;
  64.  
  65. UWORD                   CurPage = 0;
  66. STRPTR                  *PageLabels;
  67. struct GadgetData *PageNGad;
  68. UWORD                   OptGadNum;
  69.  
  70. struct TagItem TabToPageMap[] = {                       /* update map between page */
  71.         MX_Active,              PAGE_Active,              /* tab gadget and page object */
  72.         TAG_DONE
  73. };
  74.  
  75. /************************************************************************
  76. ***************************  GETYAKOPTION()  ****************************
  77. *************************************************************************
  78. * Fuck knows what this does.
  79. *
  80. *************************************************************************/
  81.  
  82. VOID GetYakOption(VOID)
  83. {
  84. UWORD                   ol, optslist;
  85. UWORD                   NGad;
  86.  
  87. optslist = YHK_Takes_Opt(curhk);
  88. NGad = 0;
  89.  
  90. for (ol=0; ol<optslist; ol++)
  91.     {
  92.         OptDescription  *curdesc;
  93.         UWORD                   as,an,dn,oldflags;
  94.  
  95.         curdesc = yhktypes[curhk->yhk_Type].yhkt_OptsList[ol].Desc;
  96.         as=0;                                                                   /* ArgStr number */
  97.         an=0;                                                                   /* ArgNum number */
  98.         dn=0;                                                                   /* Desc.  number */
  99.         oldflags = curhk->yhk_Option[ol].Flags;
  100.  
  101.         curhk->yhk_Option[ol].Flags = 0;
  102.  
  103.         while (curdesc->Type != NO_OPT)
  104.                 {
  105.                 UWORD   gad;
  106.                 STRPTR  argstr=NULL;
  107.  
  108.                 gad = NGad + curdesc->DisplayID;
  109.  
  110.                 switch(curdesc->Type)
  111.                         {
  112.                         case TOGGLE_OPT:
  113.                                 curhk->yhk_Option[ol].Flags |= PageNGad[gad].gd_Flag;
  114.                                 break;
  115.  
  116.                         case STRING_OPT:
  117.                                 if (PageNGad[gad].gd_Flag)
  118.                                         argstr = DupStr(PageNGad[gad].gd_ArgStr);
  119.                                 if (oldflags & curdesc->LocalID)
  120.                                         FreeVec(curhk->yhk_Option[ol].ArgStr[as]);
  121.                                 if (argstr)
  122.                                         curhk->yhk_Option[ol].Flags |= PageNGad[gad].gd_Flag;
  123.                                 curhk->yhk_Option[ol].ArgStr[as] = argstr;
  124.                                 as++;
  125.                                 break;
  126.  
  127.                         case INTEGER_OPT:
  128.                                 if (PageNGad[gad].gd_Flag)
  129.                                         curhk->yhk_Option[ol].Flags |= PageNGad[gad].gd_Flag;
  130.                                 curhk->yhk_Option[ol].ArgNum[an] = PageNGad[gad].gd_ArgNum;
  131.                                 an++;
  132.                                 break;
  133.  
  134.                         default:
  135.                                 break;
  136.                         }
  137.  
  138.                 curdesc++;
  139.                 dn++;
  140.                 }
  141.  
  142.         NGad += dn;
  143.         }
  144. }
  145.  
  146. /************************************************************************
  147. ***********************  DISABLEOPTIONSGADGETS()  ***********************
  148. *************************************************************************
  149. * This must disable gadgets, I guess? Which ones? Dunno. Why? Dunno.
  150. *
  151. *************************************************************************/
  152.  
  153. static void DisableOptionsGadgets(UWORD listID, UWORD IDs, BOOL state)
  154. {
  155. UWORD   gad;
  156.  
  157. for (gad=0; gad<OptGadNum; gad++)
  158.         {
  159.         if ((PageNGad[gad].gd_ListID == listID) &&
  160.                         (PageNGad[gad].gd_Desc->LocalID & IDs))
  161.                 PageNGad[gad].gd_Disabled = state;
  162.         }
  163. }
  164.  
  165. /************************************************************************
  166. ********************  MUTUALEXCLUDEOPTIONSGADGETS()  ********************
  167. *************************************************************************
  168. * Err, dunno.
  169. *
  170. *************************************************************************/
  171.  
  172. static void MutualExcludeOptionsGadgets(UWORD listID, UWORD ID, UWORD excludeIDs)
  173. {
  174. UWORD   gad;
  175.  
  176. for (gad=0; gad<OptGadNum; gad++)
  177.         {
  178.         if (PageNGad[gad].gd_ListID == listID)
  179.                 {
  180.                 if (PageNGad[gad].gd_Desc->LocalID & ID)
  181.                         PageNGad[gad].gd_Flag = PageNGad[gad].gd_Desc->LocalID;
  182.  
  183.                 if (PageNGad[gad].gd_Flag & excludeIDs)
  184.                         PageNGad[gad].gd_Flag = 0;
  185.                 }
  186.         }
  187. }
  188.  
  189. /************************************************************************
  190. ************************  INITOPTIONSGADGETS()  *************************
  191. *************************************************************************
  192. * Inits the gadgets, I suppose.
  193. *
  194. *************************************************************************/
  195.  
  196. VOID InitOptionsGadgets(VOID)
  197. {
  198. UWORD gad;
  199.  
  200. for (gad=0; gad<OptGadNum; gad++)
  201.         {
  202.         if (PageNGad[gad].gd_Desc->ActivateIDs)
  203.                 DisableOptionsGadgets(PageNGad[gad].gd_ListID,
  204.                         PageNGad[gad].gd_Desc->ActivateIDs,
  205.                         (PageNGad[gad].gd_Flag ? FALSE: TRUE));
  206.         }
  207.  
  208.  
  209. SetGadgetAttrs((struct Gadget *)MX_Page, OptionsWnd, NULL,
  210.                MX_Active, CurPage, TAG_DONE);
  211.  
  212. for(gad=0; gad<OptGadNum; gad++)
  213.         {
  214.         if (PageNGad[gad].gd_ListID == CurPage)
  215.                 {
  216.                 switch(PageNGad[gad].gd_Type)
  217.                         {
  218.                         case CHECKBOX_KIND:
  219.                                 SetGadgetAttrs(PageNGad[gad].gd_Gadget, OptionsWnd, NULL,
  220.                                         GA_Selected, (BOOL)PageNGad[gad].gd_Flag, TAG_DONE);
  221.                                 break;
  222.  
  223.                         case STRING_KIND:
  224.                                 SetGadgetAttrs(PageNGad[gad].gd_Gadget, OptionsWnd, NULL,
  225.                                         STRINGA_TextVal, (LONG)PageNGad[gad].gd_ArgStr, TAG_DONE);
  226.                                 break;
  227.  
  228.                         case INTEGER_KIND:
  229.                                 SetGadgetAttrs(PageNGad[gad].gd_Gadget, OptionsWnd, NULL,
  230.                                         STRINGA_LongVal, (LONG)PageNGad[gad].gd_ArgNum, TAG_DONE);
  231.                                 break;
  232.  
  233.                         default:
  234.                                 break;
  235.                         }
  236.  
  237.                 SetGadgetAttrs(PageNGad[gad].gd_Gadget, OptionsWnd, NULL,
  238.                         GA_Disabled, (BOOL)PageNGad[gad].gd_Disabled, TAG_DONE);
  239.                 }
  240.         }
  241. }
  242.  
  243. /************************************************************************
  244. *********************  SETDEFAULTOPTIONSGADGETS()  **********************
  245. *************************************************************************
  246. * Sets default options? Probably.
  247. *
  248. *************************************************************************/
  249.  
  250. static void SetDefaultOptionsGadgets(void)
  251. {
  252. UWORD   gad;
  253.  
  254. for (gad=0; gad<OptGadNum; gad++)
  255.         {
  256.         OptDescription *curdesc=PageNGad[gad].gd_Desc;
  257.  
  258.         PageNGad[gad].gd_Flag = curdesc->DefFlag;
  259.  
  260.         switch (curdesc->Type)
  261.                 {
  262.                 case STRING_OPT:
  263.                         PageNGad[gad].gd_ArgStr = curdesc->DefArgStr;
  264.                         break;
  265.  
  266.                 case INTEGER_OPT:
  267.                         PageNGad[gad].gd_ArgNum = curdesc->DefArgNum;
  268.                 break;
  269.                 }
  270.         }
  271.  
  272. InitOptionsGadgets();
  273. }
  274.  
  275. /************************************************************************
  276. *************************  BUILDGADGETARRAY()  **************************
  277. *************************************************************************
  278. * Builds an array of gadgets. Yup, that's what it does.
  279. *
  280. *************************************************************************/
  281.  
  282. static void BuildGadgetArray(void)
  283. {
  284. OptDescription  *curdesc;
  285. UWORD                   NGad,gad;
  286. UWORD                   ol, optslist;
  287.  
  288. optslist  = YHK_Takes_Opt(curhk);
  289.  
  290. /* Find number of gadgets */
  291.  
  292. OptGadNum = 0;
  293. for (ol=0; ol<optslist; ol++)
  294.         {
  295.         curdesc = yhktypes[curhk->yhk_Type].yhkt_OptsList[ol].Desc;
  296.  
  297.         while (curdesc->Type != NO_OPT)
  298.                 {
  299.                 OptGadNum++;
  300.                 curdesc++;
  301.                 }
  302.         }
  303.  
  304. /* Allocate some memory for gadgets & labels */
  305.  
  306. PageNGad   = (struct GadgetData *) AllocVec(
  307.         OptGadNum * sizeof(struct GadgetData), MEMF_PUBLIC|MEMF_CLEAR);
  308.  
  309. PageLabels = (STRPTR *) AllocVec(
  310.         (optslist+1) * sizeof(STRPTR), MEMF_PUBLIC|MEMF_CLEAR);
  311.  
  312. /* Now fill the arrays with gadgets and labels */
  313.  
  314. NGad = 0;
  315.  
  316. for (ol=0; ol<optslist; ol++)
  317.         {
  318.         UWORD as=0;   /* ArgStr number */
  319.         UWORD an=0;   /* ArgNum number */
  320.         UWORD dn=0;   /* Desc.  number */
  321.  
  322.         curdesc = yhktypes[curhk->yhk_Type].yhkt_OptsList[ol].Desc;
  323.  
  324.         PageLabels[ol] = getString(
  325.                 yhktypes[curhk->yhk_Type].yhkt_OptsList[ol].LabelID);
  326.  
  327.         while (curdesc->Type != NO_OPT)
  328.                 {
  329.                 gad = NGad + curdesc->DisplayID;
  330.  
  331.                 switch(curdesc->Type)
  332.                         {
  333.                         case TOGGLE_OPT:
  334.                                 PageNGad[gad].gd_Type     = CHECKBOX_KIND;
  335.                                 PageNGad[gad].gd_Flag = (curhk->yhk_Option[ol].Flags &
  336.                                         curdesc->LocalID);
  337.                                 break;
  338.  
  339.                         case STRING_OPT:
  340.                                 PageNGad[gad].gd_Type     = STRING_KIND;
  341.                                 if (PageNGad[gad].gd_Flag = (curhk->yhk_Option[ol].Flags &
  342.                                                 curdesc->LocalID))
  343.                                         {
  344.                                         PageNGad[gad].gd_ArgStr = curhk->yhk_Option[ol].ArgStr[as];
  345.                                         }
  346.                                 as++;
  347.                                 break;
  348.  
  349.                         case INTEGER_OPT:
  350.                                 PageNGad[gad].gd_Type     = INTEGER_KIND;
  351.                                 if (PageNGad[gad].gd_Flag = (curhk->yhk_Option[ol].Flags &
  352.                                                 curdesc->LocalID))
  353.                                         {
  354.                                         PageNGad[gad].gd_ArgNum = curhk->yhk_Option[ol].ArgNum[an];
  355.                                         }
  356.                                 an++;
  357.                                 break;
  358.  
  359.                         default:
  360.                                 break;
  361.                         }
  362.  
  363.                 PageNGad[gad].gd_ListID   = ol;
  364.                 PageNGad[gad].gd_Desc     = curdesc;
  365.                 PageNGad[gad].gd_Text     = getString(curdesc->LabelID);
  366.                 PageNGad[gad].gd_ReturnID = GD_FirstOption + gad;
  367.  
  368.                 curdesc++;
  369.                 dn++;
  370.                 } /* endwhile curdesc!=NO_OPT */
  371.  
  372.         NGad += dn;
  373.         } /* next ol */
  374.  
  375. }
  376.  
  377. /************************************************************************
  378. ****************************  CREATEPAGE()  *****************************
  379. *************************************************************************
  380. * Create a page object for the given page number.
  381. *
  382. *************************************************************************/
  383.  
  384. static Object *CreatePage(UWORD page)
  385. {
  386. Object  *pgobj;
  387. UWORD   lc;
  388. BOOL    minw,minh;
  389.  
  390. pgobj = VGroupObject, Spacing(2), EndObject;
  391.  
  392. if (!pgobj)
  393.         return(NULL);
  394.  
  395. for(lc = 0; lc < OptGadNum; lc++)
  396.         {
  397.         if (PageNGad[lc].gd_ListID == page)
  398.                 {
  399.                 switch(PageNGad[lc].gd_Type)
  400.                         {
  401.                         case CHECKBOX_KIND:
  402.                                 PageNGad[lc].gd_Gadget = (struct Gadget *) CheckBoxObject,
  403.                                                 LAB_Label,              PageNGad[lc].gd_Text,
  404.                                                 GA_ID,                  PageNGad[lc].gd_ReturnID,
  405.                                                 ButtonFrame,
  406.                                                 FRM_Flags,              FRF_EDGES_ONLY,
  407.                                                 EndObject;
  408.                                 minw = TRUE;
  409.                                 minh = TRUE;
  410.                                 break;
  411.  
  412.                         case STRING_KIND:
  413.                                 PageNGad[lc].gd_Gadget = (struct Gadget *) StringObject,
  414.                                                 LAB_Label,              PageNGad[lc].gd_Text,
  415.                                                 GA_ID,                  PageNGad[lc].gd_ReturnID,
  416.                                                 RidgeFrame,
  417.                                                 STRINGA_MaxChars, 99,
  418.                                                 EndObject;
  419.                                 minw = FALSE;
  420.                                 minh = TRUE;
  421.                                 break;
  422.  
  423.                         case INTEGER_KIND:
  424.                                 PageNGad[lc].gd_Gadget = (struct Gadget *) StringObject,
  425.                                                 LAB_Label,              PageNGad[lc].gd_Text,
  426.                                                 GA_ID,                  PageNGad[lc].gd_ReturnID,
  427.                                                 RidgeFrame,
  428.                                                 STRINGA_MaxChars, 11,
  429.                                                 STRINGA_LongVal, 0,
  430.                                                 EndObject;
  431.                                 minw = FALSE;
  432.                                 minh = TRUE;
  433.                                 break;
  434.  
  435.                         default:
  436.                                 PageNGad[lc].gd_Gadget = NULL;
  437.                                 break;
  438.                         }
  439.  
  440.                 if (PageNGad[lc].gd_Gadget)
  441.                         {
  442.                         DoMethod(pgobj,GRM_ADDMEMBER,PageNGad[lc].gd_Gadget,
  443.                                         LGO_FixMinWidth,        minw,
  444.                                         LGO_FixMinHeight,       minh,
  445.                                         TAG_END);
  446.                         DoMethod(pgobj, GRM_ADDSPACEMEMBER, (DEFAULT_WEIGHT/10));
  447.                         }
  448.                 else
  449.                         {
  450.                         DisposeObject(pgobj);
  451.                         return(NULL);
  452.                         }
  453.                 }
  454.         }
  455.  
  456. return(pgobj);
  457. }
  458.  
  459. /************************************************************************
  460. ************************  CREATEOPTIONSWINDOW()  ************************
  461. *************************************************************************
  462. * Create the Options window object.
  463. *
  464. *************************************************************************/
  465.  
  466. APTR CreateOptionsWindow(VOID)
  467. {
  468. Object  *obj,*pg;
  469. UWORD   i;
  470.  
  471. /* count # pages */
  472. i = 0;
  473. while(PageLabels[i]) i++;
  474.  
  475. obj = WindowObject,
  476.         WINDOW_PubScreenName, PubScreenName,
  477.         WINDOW_Title,           OptionsWdt,
  478.         WINDOW_ScreenTitle,     getString(COPYRIGHT_STRING),
  479.         WINDOW_SmartRefresh, TRUE,
  480.         WINDOW_SizeBottom,      FALSE,                  /* put size gadget in right border */
  481.         WINDOW_SizeRight,       TRUE,
  482.         WINDOW_AutoAspect,      TRUE,                   /* automatic edges pixel width */
  483.         WINDOW_Position,        POS_CENTERMOUSE,
  484.         (OptionsBoxValid ? WINDOW_Bounds : TAG_IGNORE), &OptionsBox,
  485.         WINDOW_AppWindow,       TRUE,                   /* make it an appwindow */
  486.         WINDOW_RMBTrap,         TRUE,                   /* trap rmb - no menu */
  487.         WINDOW_CloseGadget,     FALSE,                  /* no windowclose gadget please */
  488.         (TextFont ? WINDOW_Font : TAG_IGNORE),  &Attr,  /* use font if specified */
  489.         WINDOW_HelpFile,        PrefsHelp,              /* online help system */
  490.         WINDOW_HelpNode,        yhktypes[curtype].yhkt_HelpNode,
  491.         WINDOW_MasterGroup,
  492.                 VGroupObject, Spacing(4), HOffset(4), VOffset(4),
  493.                         StartMember,
  494.                                 MX_Page = MxObject,
  495.                                         GA_ID,                  GD_Page_Opts,
  496.                                         MX_Labels,              PageLabels,
  497.                                         MX_TabsObject,  TRUE,
  498.                                 EndObject, FixMinHeight,
  499.                         EndMember,
  500.                         StartMember,
  501.                                 HorizSeparator,
  502.                         EndMember,
  503.                         StartMember,
  504.                                 pg = PageObject,
  505.                                         PAGE_Member,    CreatePage(0),
  506.                                         ((i > 1) ? PAGE_Member : TAG_IGNORE),
  507.                                                                         ((i > 1) ? CreatePage(1) : NULL),
  508.                                         ((i > 2) ? PAGE_Member : TAG_IGNORE),
  509.                                                                         ((i > 2) ? CreatePage(2) : NULL),
  510.                                         ((i > 3) ? PAGE_Member : TAG_IGNORE),
  511.                                                                         ((i > 3) ? CreatePage(3) : NULL),
  512.                                         ((i > 4) ? PAGE_Member : TAG_IGNORE),
  513.                                 EndObject, Weight(DEFAULT_WEIGHT*4),
  514.                         EndMember,
  515.                         VarSpace(DEFAULT_WEIGHT/10),
  516.                         StartMember,
  517.                                 HorizSeparator,
  518.                         EndMember,
  519.                         StartMember,
  520.                                 HGroupObject, Spacing(2), EqualWidth,
  521.                                         StartMember,
  522.                                                 BT_OK_Opts = Button(
  523.                                                                 getString(OK_STRING),GD_OK_Opts),
  524.                                         EndMember,
  525.                                         VarSpace(DEFAULT_WEIGHT/2),
  526.                                         StartMember,
  527.                                                 BT_Default_Opts = Button(
  528.                                                                 getString(MENU_DEFAULT_STRING),GD_Default_Opts),
  529.                                         EndMember,
  530.                                         VarSpace(DEFAULT_WEIGHT/2),
  531.                                         StartMember,
  532.                                                 BT_Cancel_Opts = Button(
  533.                                                                 getString(CANCEL_STRING),GD_Cancel_Opts),
  534.                                         EndMember,
  535.                                 EndObject,
  536.                         EndMember,
  537.                 EndObject,
  538.         EndObject;
  539.  
  540. if (obj)
  541.         /* add a notification map from page tabs gadget to page object */
  542.         AddMap(MX_Page,pg,TabToPageMap);
  543.  
  544. return(obj);
  545. }
  546.  
  547. /************************************************************************
  548. ************************  CLOSEOPTIONSWINDOW()  *************************
  549. *************************************************************************
  550. * Close the options window.
  551. *
  552. *************************************************************************/
  553.  
  554. VOID CloseOptionsWindow(VOID)
  555. {
  556. if (OptionsWnd)
  557.         {
  558.         GetAttr(WINDOW_Bounds,OptionsWndObj,(ULONG *) &OptionsBox);
  559.         OptionsBox.Width = OptionsBox.Height = 0;
  560.         OptionsBoxValid = TRUE;
  561.         }
  562.  
  563. DisposeObject(OptionsWndObj);
  564. OptionsWndObj = NULL;
  565. OptionsWnd = NULL;
  566.  
  567. FreeVec(PageNGad);
  568. FreeVec(PageLabels);
  569.  
  570. }
  571.  
  572. /************************************************************************
  573. ***********************  HANDLEOPTIONSRETURNID()  ***********************
  574. *************************************************************************
  575. * Handle Options window events.
  576. *
  577. *************************************************************************/
  578.  
  579. LONG HandleOptionsReturnID(LONG id)
  580. {
  581. LONG    ret;
  582. ULONG   code;
  583. ULONG   ID;
  584.  
  585. ret = RET_OKAY;
  586.  
  587. switch(id)
  588.         {
  589.         case GD_Page_Opts:
  590.                 GetAttr(MX_Active,MX_Page,&code);
  591.                 CurPage = code;
  592.                 InitOptionsGadgets();
  593.                 break;
  594.  
  595.         case GD_Default_Opts:
  596.                 SetDefaultOptionsGadgets();
  597.                 break;
  598.  
  599.         case GD_OK_Opts:
  600.                 GetYakOption();
  601.                 CloseOptionsWindow();
  602.                 if (!ShowWindowID(HOTKEY_WINDOW))
  603.                         ret = RET_QUIT;
  604.                 CurPage = 0;
  605.                 break;
  606.  
  607.         case GD_Cancel_Opts:
  608.                 CloseOptionsWindow();
  609.                 if (!ShowWindowID(HOTKEY_WINDOW))
  610.                         ret = RET_QUIT;
  611.                 CurPage = 0;
  612.                 break;
  613.  
  614.         default:
  615.                 if (id < 65536)
  616.                         {
  617.                         ID = id - GD_FirstOption;
  618.  
  619.                         if (PageNGad[ID].gd_ListID == CurPage)
  620.                                 {
  621.                                 switch(PageNGad[ID].gd_Type)
  622.                                         {
  623.                                         case CHECKBOX_KIND:
  624.                                                 PageNGad[ID].gd_Flag ^= PageNGad[ID].gd_Desc->LocalID;
  625.  
  626.                                                 if (PageNGad[ID].gd_Desc->ExcludeIDs)
  627.                                                         MutualExcludeOptionsGadgets(PageNGad[ID].gd_ListID,
  628.                                                                 PageNGad[ID].gd_Desc->LocalID,
  629.                                                                 PageNGad[ID].gd_Desc->ExcludeIDs);
  630.  
  631.                                                 InitOptionsGadgets();
  632.                                                 break;
  633.  
  634.                                         case STRING_KIND:
  635.                                                 GetAttr(STRINGA_TextVal,PageNGad[ID].gd_Gadget,&code);
  636.                                                 PageNGad[ID].gd_ArgStr = (char *)code;
  637.  
  638.                                                 if (*PageNGad[ID].gd_ArgStr)
  639.                                                         PageNGad[ID].gd_Flag = PageNGad[ID].gd_Desc->LocalID;
  640.                                                 else
  641.                                                         PageNGad[ID].gd_Flag = 0;
  642.  
  643.                                                 InitOptionsGadgets();
  644.                                                 break;
  645.  
  646.                                         case INTEGER_KIND:
  647.                                                 GetAttr(STRINGA_LongVal,PageNGad[ID].gd_Gadget,&code);
  648.                                                 PageNGad[ID].gd_ArgNum = code;
  649.                                                 PageNGad[ID].gd_Flag   = PageNGad[ID].gd_Desc->LocalID;
  650.                                                 InitOptionsGadgets();
  651.                                                 break;
  652.  
  653.                                         default:
  654.                                                 break;
  655.                                         }
  656.                                 }
  657.                         }
  658.  
  659.                 break;
  660.         }
  661.  
  662. return(ret);
  663. }
  664.  
  665. /************************************************************************
  666. *************************  SHOWOPTIONSWINDOW()  *************************
  667. *************************************************************************
  668. * Show our Options window.
  669. *
  670. *************************************************************************/
  671.  
  672. BOOL ShowOptionsWindow(VOID)
  673. {
  674. static char title[80];
  675.  
  676. BuildGadgetArray();
  677.  
  678. strcpy(title, getString(Options_Window_TITLE));
  679. strcat(title, " ");
  680. strcat(title, (curhk->yhk_Name ? curhk->yhk_Name : "<<unnamed>>"));
  681. OptionsWdt = title;
  682.  
  683. if (OptionsWndObj = (Object *)CreateOptionsWindow())
  684.         {
  685.         if (OptionsWnd = WindowOpen(OptionsWndObj))
  686.                 {
  687.                 InitOptionsGadgets();
  688.                 HandleReturnID = HandleOptionsReturnID;
  689.                 curwin = OptionsWnd;
  690.                 curwinobj = OptionsWndObj;
  691.                 curwinID = OPTIONS_WINDOW;
  692.                 return(TRUE);
  693.                 }
  694.         }
  695.  
  696. CloseOptionsWindow();
  697. curwin = NULL;
  698. curwinobj = NULL;
  699. wndsigflag = 0L;
  700. appwinsigflag = 0L;
  701.  
  702. FreeVec(PageNGad);
  703. FreeVec(PageLabels);
  704.  
  705. return(FALSE);
  706. }
  707.  
  708. /************************************************************************
  709. ***********************  SWITCHTOOPTIONSWINDOW()  ***********************
  710. *************************************************************************
  711. * Switch from Hotkey window to Options window.
  712. *
  713. *************************************************************************/
  714.  
  715. BOOL SwitchToOptionsWindow(VOID)
  716. {
  717. CloseWindowID(HOTKEY_WINDOW);
  718. return(ShowOptionsWindow());
  719. }       
  720.  
  721.